# 导入必要的包
import cv2
import gradio as gr
import numpy as np
from sklearn.cluster import KMeans
# 提取图像的主要颜色
def extract_main_colors(image, n_colors=5):
    # 将图像reshape为(-1,3)的二维数组
    pixels = image.reshape(-1, 3)
    # 使用KMeans算法，初始化一个聚类器，设置聚类数量为n_colors
    kmeans = KMeans(n_clusters=n_colors)
    # 对像素进行聚类
    kmeans.fit(pixels)
    # 获取聚类中心，即主要颜色
    colors = kmeans.cluster_centers_
    # 将颜色值转换为整数
    colors = colors.round().astype(int)
    return colors
# 定义 gradio 应用函数
def gradio_app(image):
    # 提取图像的主要颜色
    colors = extract_main_colors(image)
    # 将颜色转换为十六进制表示
    hex_colors = ["#%02x%02x%02x" % (color[0], color[1], color[2]) for color in colors]
    # 创建颜色调色板图像
    palette = np.zeros((100, 100 * len(colors), 3), dtype=np.uint8)
    for i, color in enumerate(colors):
        palette[:, i * 100:(i + 1) * 100] = color
    # 返回颜色调色板图像和颜色调色板的十六进制表示
    return palette, "\n".join(hex_colors)
# 创建 gradio 用户界面
iface = gr.Interface(
    fn=gradio_app,
    inputs=gr.components.Image(),
    outputs=[
        gr.components.Image(type="numpy", show_label=False, width=500),
        gr.components.Label(label="色彩十六进制编码")
    ],
    title="调色板提取器",
)
iface.launch()  # 启动 gradio 应用